package com.cencat.order.domain;

import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import jakarta.validation.constraints.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.LocalDate;

/**
 * 线路发票信息实体类
 * 
 * @author cencat
 * @date 2024-01-20
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("sys_route_invoice")
public class RouteInvoice implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 发票ID
     */
    @TableId(value = "invoice_id", type = IdType.AUTO)
    private Long invoiceId;

    /**
     * 发票编号
     */
    @NotBlank(message = "发票编号不能为空")
    @Size(max = 50, message = "发票编号长度不能超过50个字符")
    @TableField("invoice_code")
    private String invoiceCode;

    /**
     * 发票号码
     */
    @NotBlank(message = "发票号码不能为空")
    @Size(max = 50, message = "发票号码长度不能超过50个字符")
    @TableField("invoice_number")
    private String invoiceNumber;

    /**
     * 发票类型(1-增值税专用发票 2-增值税普通发票 3-电子发票)
     */
    @NotNull(message = "发票类型不能为空")
    @TableField("invoice_type")
    private Integer invoiceType;

    /**
     * 发票状态(0-草稿 1-已开具 2-已发送 3-已确认 4-已作废 5-已红冲)
     */
    @NotNull(message = "发票状态不能为空")
    @TableField("invoice_status")
    private Integer invoiceStatus;

    /**
     * 路线ID
     */
    @TableField("route_id")
    private Long routeId;

    /**
     * 路线编号
     */
    @Size(max = 50, message = "路线编号长度不能超过50个字符")
    @TableField("route_code")
    private String routeCode;

    /**
     * 路线名称
     */
    @Size(max = 100, message = "路线名称长度不能超过100个字符")
    @TableField("route_name")
    private String routeName;

    /**
     * 商家ID
     */
    @NotNull(message = "商家ID不能为空")
    @TableField("merchant_id")
    private Long merchantId;

    /**
     * 商家编号
     */
    @NotBlank(message = "商家编号不能为空")
    @Size(max = 50, message = "商家编号长度不能超过50个字符")
    @TableField("merchant_code")
    private String merchantCode;

    /**
     * 商家名称
     */
    @NotBlank(message = "商家名称不能为空")
    @Size(max = 100, message = "商家名称长度不能超过100个字符")
    @TableField("merchant_name")
    private String merchantName;

    /**
     * 购买方名称
     */
    @NotBlank(message = "购买方名称不能为空")
    @Size(max = 100, message = "购买方名称长度不能超过100个字符")
    @TableField("buyer_name")
    private String buyerName;

    /**
     * 购买方纳税人识别号
     */
    @Size(max = 50, message = "购买方纳税人识别号长度不能超过50个字符")
    @TableField("buyer_tax_number")
    private String buyerTaxNumber;

    /**
     * 购买方地址电话
     */
    @Size(max = 200, message = "购买方地址电话长度不能超过200个字符")
    @TableField("buyer_address_phone")
    private String buyerAddressPhone;

    /**
     * 购买方开户行及账号
     */
    @Size(max = 200, message = "购买方开户行及账号长度不能超过200个字符")
    @TableField("buyer_bank_account")
    private String buyerBankAccount;

    /**
     * 销售方名称
     */
    @NotBlank(message = "销售方名称不能为空")
    @Size(max = 100, message = "销售方名称长度不能超过100个字符")
    @TableField("seller_name")
    private String sellerName;

    /**
     * 销售方纳税人识别号
     */
    @NotBlank(message = "销售方纳税人识别号不能为空")
    @Size(max = 50, message = "销售方纳税人识别号长度不能超过50个字符")
    @TableField("seller_tax_number")
    private String sellerTaxNumber;

    /**
     * 销售方地址电话
     */
    @Size(max = 200, message = "销售方地址电话长度不能超过200个字符")
    @TableField("seller_address_phone")
    private String sellerAddressPhone;

    /**
     * 销售方开户行及账号
     */
    @Size(max = 200, message = "销售方开户行及账号长度不能超过200个字符")
    @TableField("seller_bank_account")
    private String sellerBankAccount;

    /**
     * 开票日期
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @TableField("invoice_date")
    private LocalDate invoiceDate;

    /**
     * 服务期间开始日期
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @TableField("service_start_date")
    private LocalDate serviceStartDate;

    /**
     * 服务期间结束日期
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @TableField("service_end_date")
    private LocalDate serviceEndDate;

    /**
     * 货物或应税劳务名称
     */
    @NotBlank(message = "货物或应税劳务名称不能为空")
    @Size(max = 200, message = "货物或应税劳务名称长度不能超过200个字符")
    @TableField("goods_name")
    private String goodsName;

    /**
     * 规格型号
     */
    @Size(max = 100, message = "规格型号长度不能超过100个字符")
    @TableField("specification")
    private String specification;

    /**
     * 单位
     */
    @Size(max = 20, message = "单位长度不能超过20个字符")
    @TableField("unit")
    private String unit;

    /**
     * 数量
     */
    @DecimalMin(value = "0.0", message = "数量不能小于0")
    @TableField("quantity")
    private BigDecimal quantity;

    /**
     * 单价
     */
    @DecimalMin(value = "0.0", message = "单价不能小于0")
    @TableField("unit_price")
    private BigDecimal unitPrice;

    /**
     * 金额(不含税)
     */
    @NotNull(message = "金额不能为空")
    @DecimalMin(value = "0.0", message = "金额不能小于0")
    @TableField("amount")
    private BigDecimal amount;

    /**
     * 税率(%)
     */
    @DecimalMin(value = "0.0", message = "税率不能小于0")
    @DecimalMax(value = "100.0", message = "税率不能大于100")
    @TableField("tax_rate")
    private BigDecimal taxRate;

    /**
     * 税额
     */
    @DecimalMin(value = "0.0", message = "税额不能小于0")
    @TableField("tax_amount")
    private BigDecimal taxAmount;

    /**
     * 价税合计
     */
    @NotNull(message = "价税合计不能为空")
    @DecimalMin(value = "0.0", message = "价税合计不能小于0")
    @TableField("total_amount")
    private BigDecimal totalAmount;

    /**
     * 价税合计(大写)
     */
    @Size(max = 200, message = "价税合计大写长度不能超过200个字符")
    @TableField("total_amount_chinese")
    private String totalAmountChinese;

    /**
     * 备注
     */
    @Size(max = 500, message = "备注长度不能超过500个字符")
    @TableField("invoice_remark")
    private String invoiceRemark;

    /**
     * 收款人
     */
    @Size(max = 50, message = "收款人长度不能超过50个字符")
    @TableField("payee")
    private String payee;

    /**
     * 复核
     */
    @Size(max = 50, message = "复核长度不能超过50个字符")
    @TableField("reviewer")
    private String reviewer;

    /**
     * 开票人
     */
    @Size(max = 50, message = "开票人长度不能超过50个字符")
    @TableField("drawer")
    private String drawer;

    /**
     * 机器编号
     */
    @Size(max = 50, message = "机器编号长度不能超过50个字符")
    @TableField("machine_code")
    private String machineCode;

    /**
     * 校验码
     */
    @Size(max = 50, message = "校验码长度不能超过50个字符")
    @TableField("check_code")
    private String checkCode;

    /**
     * 发票文件路径
     */
    @Size(max = 200, message = "发票文件路径长度不能超过200个字符")
    @TableField("file_path")
    private String filePath;

    /**
     * 发票PDF路径
     */
    @Size(max = 200, message = "发票PDF路径长度不能超过200个字符")
    @TableField("pdf_path")
    private String pdfPath;

    /**
     * 发票图片路径
     */
    @Size(max = 200, message = "发票图片路径长度不能超过200个字符")
    @TableField("image_path")
    private String imagePath;

    /**
     * 电子发票URL
     */
    @Size(max = 500, message = "电子发票URL长度不能超过500个字符")
    @TableField("electronic_url")
    private String electronicUrl;

    /**
     * 二维码内容
     */
    @Size(max = 500, message = "二维码内容长度不能超过500个字符")
    @TableField("qr_code")
    private String qrCode;

    /**
     * 发送状态(0-未发送 1-已发送 2-发送失败)
     */
    @TableField("send_status")
    private Integer sendStatus;

    /**
     * 发送时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField("send_time")
    private LocalDateTime sendTime;

    /**
     * 发送方式(1-邮件 2-短信 3-微信 4-下载)
     */
    @TableField("send_method")
    private Integer sendMethod;

    /**
     * 接收邮箱
     */
    @Email(message = "邮箱格式不正确")
    @Size(max = 100, message = "接收邮箱长度不能超过100个字符")
    @TableField("receive_email")
    private String receiveEmail;

    /**
     * 接收手机号
     */
    @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确")
    @TableField("receive_phone")
    private String receivePhone;

    /**
     * 确认状态(0-未确认 1-已确认)
     */
    @TableField("confirm_status")
    private Integer confirmStatus;

    /**
     * 确认时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField("confirm_time")
    private LocalDateTime confirmTime;

    /**
     * 确认人
     */
    @Size(max = 50, message = "确认人长度不能超过50个字符")
    @TableField("confirm_by")
    private String confirmBy;

    /**
     * 作废时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField("void_time")
    private LocalDateTime voidTime;

    /**
     * 作废原因
     */
    @Size(max = 200, message = "作废原因长度不能超过200个字符")
    @TableField("void_reason")
    private String voidReason;

    /**
     * 作废人
     */
    @Size(max = 50, message = "作废人长度不能超过50个字符")
    @TableField("void_by")
    private String voidBy;

    /**
     * 红冲时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField("red_rush_time")
    private LocalDateTime redRushTime;

    /**
     * 红冲原因
     */
    @Size(max = 200, message = "红冲原因长度不能超过200个字符")
    @TableField("red_rush_reason")
    private String redRushReason;

    /**
     * 红冲人
     */
    @Size(max = 50, message = "红冲人长度不能超过50个字符")
    @TableField("red_rush_by")
    private String redRushBy;

    /**
     * 原发票ID(红冲时关联)
     */
    @TableField("original_invoice_id")
    private Long originalInvoiceId;

    /**
     * 原发票编号
     */
    @Size(max = 50, message = "原发票编号长度不能超过50个字符")
    @TableField("original_invoice_code")
    private String originalInvoiceCode;

    /**
     * 打印次数
     */
    @Min(value = 0, message = "打印次数不能小于0")
    @TableField("print_count")
    private Integer printCount;

    /**
     * 最后打印时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField("last_print_time")
    private LocalDateTime lastPrintTime;

    /**
     * 模板ID
     */
    @TableField("template_id")
    private Long templateId;

    /**
     * 模板名称
     */
    @Size(max = 100, message = "模板名称长度不能超过100个字符")
    @TableField("template_name")
    private String templateName;

    /**
     * 批次号
     */
    @Size(max = 50, message = "批次号长度不能超过50个字符")
    @TableField("batch_number")
    private String batchNumber;

    /**
     * 生成方式(1-单个生成 2-批量生成 3-自动生成)
     */
    @TableField("generate_method")
    private Integer generateMethod;

    /**
     * 审核状态(0-待审核 1-审核通过 2-审核拒绝)
     */
    @TableField("audit_status")
    private Integer auditStatus;

    /**
     * 审核时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField("audit_time")
    private LocalDateTime auditTime;

    /**
     * 审核人
     */
    @Size(max = 50, message = "审核人长度不能超过50个字符")
    @TableField("audit_by")
    private String auditBy;

    /**
     * 审核意见
     */
    @Size(max = 200, message = "审核意见长度不能超过200个字符")
    @TableField("audit_opinion")
    private String auditOpinion;

    /**
     * 归档状态(0-未归档 1-已归档)
     */
    @TableField("archive_status")
    private Integer archiveStatus;

    /**
     * 归档时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField("archive_time")
    private LocalDateTime archiveTime;

    /**
     * 归档路径
     */
    @Size(max = 200, message = "归档路径长度不能超过200个字符")
    @TableField("archive_path")
    private String archivePath;

    /**
     * 对账状态(0-未对账 1-已对账 2-对账异常)
     */
    @TableField("reconcile_status")
    private Integer reconcileStatus;

    /**
     * 对账时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField("reconcile_time")
    private LocalDateTime reconcileTime;

    /**
     * 对账人
     */
    @Size(max = 50, message = "对账人长度不能超过50个字符")
    @TableField("reconcile_by")
    private String reconcileBy;

    /**
     * 对账结果
     */
    @Size(max = 200, message = "对账结果长度不能超过200个字符")
    @TableField("reconcile_result")
    private String reconcileResult;

    /**
     * 扩展信息(JSON格式)
     */
    @TableField("extend_info")
    private String extendInfo;

    /**
     * 删除标志(0-存在 1-删除)
     */
    @TableLogic
    @TableField("del_flag")
    private Integer delFlag;

    /**
     * 备注
     */
    @Size(max = 500, message = "备注长度不能超过500个字符")
    @TableField("remark")
    private String remark;

    /**
     * 创建者
     */
    @TableField(value = "create_by", fill = FieldFill.INSERT)
    private String createBy;

    /**
     * 创建时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private LocalDateTime createTime;

    /**
     * 更新者
     */
    @TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE)
    private String updateBy;

    /**
     * 更新时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;

    /**
     * 扩展字段1
     */
    @Size(max = 200, message = "扩展字段1长度不能超过200个字符")
    @TableField("ext_field1")
    private String extField1;

    /**
     * 扩展字段2
     */
    @Size(max = 200, message = "扩展字段2长度不能超过200个字符")
    @TableField("ext_field2")
    private String extField2;

    /**
     * 扩展字段3
     */
    @Size(max = 200, message = "扩展字段3长度不能超过200个字符")
    @TableField("ext_field3")
    private String extField3;

    /**
     * 版本号(乐观锁)
     */
    @Version
    @TableField("version")
    private Integer version;
}